package uy.org.softtech.cssuite.aspectos;

import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.apache.commons.lang.StringUtils.overlay;
import static uy.org.softtech.cssuite.helpers.HelperFechaHora.horaActual;
import static uy.org.softtech.cssuite.helpers.HelperSeguridad.usuarioActual;

import java.sql.Timestamp;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import uy.org.softtech.cssuite.entidad.Entidad;
import uy.org.softtech.cssuite.entidad.usuario.Usuario;


/**
 * Clase responsable de actualizar los valores de los campos de auditoría para cuando una entidad es creada o actualizada en la base de datos
 *
 * @author fabian.lobo
 */
@Aspect
@Component(value = "aspecto-auditoria")
public class AuditoriaRegistros {

	/**
	 * Actualiza los campos de auditoría (Version, Creado, Creado Por, Creado En, Actualizado, Actualizado Por, Actualizado En) cuando se crea una nueva entidad
	 * 
	 * @param entidad - La entidad a ser persistida
	 * @param servicio - Nombre del servicio que está persistiendo la entidad
	 * @return la entidad actualizada y lista para ser persistida
	 */
	@Before("execution(* uy.org.softtech.cssuite.repositorios.Repositorio*.crear(..)) && args(entidad, servicio)")
	public Entidad auditoriaCreacion(Entidad entidad, String servicio){
		String usuario = "AUTOMATICO"; 
		
		if(usuarioActual() != null) {
			//Usuario logueado
			usuario = usuarioActual().getUsuario();
		}
				
		if(isNotBlank(servicio) && servicio.length() > 200){
			servicio = overlay(servicio, "...", 0, servicio.length() - 195);
		}
		if(isBlank(usuario)) {
			usuario = servicio;
		}		
		
		Timestamp currentDate = horaActual();
		
		entidad.setCreado(currentDate);
		entidad.setCreadoPor(usuario);
		entidad.setCreadoEn(servicio);
		entidad.setVersion(Entidad.ZERO);
		entidad.setActualizado(currentDate);
		entidad.setActualizadoPor(usuario);
		entidad.setActualizadoEn(servicio);
		return entidad;
	}
	
	/**
	 * Actualiza los campos de auditoría (Version, Actualizado, Actualizado Por, Actualizado En) cuando se actualiza una entidad ya existente
	 * 
	 * @param entidad - La entidad a ser persistida
	 * @param servicio - Nombre del servicio que está persistiendo la entidad
	 * @return la entidad actualizada y lista para ser persistida
	 */
	@Before("execution(* uy.org.softtech.cssuite.repositorios.Repositorio*.actualizar(..)) && args(entidad, servicio)")
	public Entidad auditoriaActualizacion(Entidad entidad, String servicio) {
		String usuario = "AUTOMATICO"; 
		
		if(usuarioActual() != null) {
			//Usuario logueado
			usuario = usuarioActual().getUsuario();
		} else if(entidad instanceof Usuario) {
			//Usuario está ingresando a la aplicación
			Usuario user = (Usuario) entidad;
			usuario = user.getUsuario();
		}
		
		if(isNotBlank(servicio) && servicio.length() > 200){
			servicio = overlay(servicio, "...", 0, servicio.length() - 195);
		}
		
		entidad.setActualizado(horaActual());
		entidad.setActualizadoPor(usuario);
		entidad.setActualizadoEn(servicio);
		return entidad;
	}
}
